var dj = $.extend({}, dj);/* 定义全局对象，类似于命名空间或包的作用 */

/**
 * 验证密码是否一致
 */
$.extend($.fn.validatebox.defaults.rules, {
	eqpwd : {
		validator : function(value, param) {
			return value == $(param[0]).val();
		},
		message : '密码不一致！'
	}
});

$.extend($.fn.validatebox.defaults.rules, {
	custom_remote : {
		validator : function(value, param) {
			var v_result;
			var postdata = {};
			postdata[param[1]] = value;
			$.ajax({
				type : "post",
				dataType : "json",
				url : param[0],
				data : postdata,
				async : false,
				error : function(info) {
					$.messager.show({
						msg : '获取信息失败！',
						title : '提示'
					});
					eval(info.responseText);
				},
				success : function(result) {
					v_result = result;
				}
			});
			if (!v_result.success) {
				$.fn.validatebox.defaults.rules.custom_remote.message = v_result.msg;
				return false;
			} else {
				return true;
			}
		},
		message : ''
	}
});

/**
 * 判断浏览器版本是否是IE，并且版本是否小于8
 */
dj.isLessThanIe8 = function() {
	return ($.browser.msie && $.browser.version < 8);
};

/**
 * 防止panel/window/dialog组件超出浏览器边界
 * 
 * @param left
 * @param top
 */
var easyuiPanelOnMove = function(left, top) {
	var l = left;
	var t = top;
	if (l < 1) {
		l = 1;
	}
	if (t < 1) {
		t = 1;
	}
	var width = parseInt($(this).parent().css('width')) + 14;
	var height = parseInt($(this).parent().css('height')) + 14;
	var right = l + width;
	var buttom = t + height;
	var browserWidth = $(window).width();
	var browserHeight = $(window).height();
	if (right > browserWidth) {
		l = browserWidth - width;
	}
	if (buttom > browserHeight) {
		t = browserHeight - height;
	}
	$(this).parent().css({/* 修正面板位置 */
		left : l,
		top : t
	});
};
$.fn.dialog.defaults.onMove = easyuiPanelOnMove;
$.fn.window.defaults.onMove = easyuiPanelOnMove;
$.fn.panel.defaults.onMove = easyuiPanelOnMove;

/**
 * 扩展tree，使其支持平滑数据格式
 */
$.fn.tree.defaults.loadFilter = function(data, parent) {
	var opt = $(this).data().tree.options;
	var idFiled, textFiled, parentField;
	if (opt.parentField) {
		idFiled = opt.idFiled || 'id';
		textFiled = opt.textFiled || 'text';
		parentField = opt.parentField;
		var i, l, treeData = [], tmpMap = [];
		for (i = 0, l = data.length; i < l; i++) {
			tmpMap[data[i][idFiled]] = data[i];
		}
		for (i = 0, l = data.length; i < l; i++) {
			if (tmpMap[data[i][parentField]] && data[i][idFiled] != data[i][parentField]) {
				if (!tmpMap[data[i][parentField]]['children'])
					tmpMap[data[i][parentField]]['children'] = [];
				data[i]['text'] = data[i][textFiled];
				tmpMap[data[i][parentField]]['children'].push(data[i]);
			} else {
				data[i]['text'] = data[i][textFiled];
				treeData.push(data[i]);
			}
		}
		return treeData;
	}
	return data;
};

/**
 * 自动触发分页的加载操作
 * 
 * @param pager
 *            各个控件对应的pagination组件
 */
function autoLoad(pager, pageNumber) {
	var event = jQuery.Event("keydown");// 模拟一个键盘事件
	event.keyCode = 13;// keyCode=13是回车
	pager.find('input.pagination-num').val(pageNumber); // 设置跳转页为当前指定页面

	pager.find('input.pagination-num').trigger(event);
}

/**
 * 格式化form参数格式为datagrid的queryParams形式
 * 
 * @param conditionFormId
 * @returns {___anonymous3300_3301}
 */
function getQueryParams(conditionFormId) {
	var searchCondition = $("#" + conditionFormId).serialize();
	var obj = {};
	var pairs = searchCondition.split('&');
	var name, value;

	$.each(pairs, function(i, pair) {
		pair = pair.split('=');
		name = decodeURIComponent(pair[0]);
		value = decodeURIComponent(pair[1]);
		value = value.replace("+", " ");

		obj[name] = !obj[name] ? value : [].concat(obj[name]).concat(value); // 若有多个同名称的参数，则拼接
	});

	return obj;
}

/**
 * 定义js数组移除方法
 * 
 * @param b
 * @returns {Boolean}
 */
Array.prototype.remove = function(b) {
	var a = this.indexOf(b);
	if (a >= 0) {
		this.splice(a, 1);
		return true;
	}
	return false;
};

/**
 * 格式化日期
 * 
 * @param fmt
 * @returns
 */
Date.prototype.format = function(fmt) {
	var o = {
		"M+" : this.getMonth() + 1, // 月份
		"d+" : this.getDate(), // 日
		"h+" : this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, // 小时
		"H+" : this.getHours(), // 小时
		"m+" : this.getMinutes(), // 分
		"s+" : this.getSeconds(), // 秒
		"q+" : Math.floor((this.getMonth() + 3) / 3), // 季度
		"S" : this.getMilliseconds()
	// 毫秒
	};
	var week = {
		"0" : "\u65e5",
		"1" : "\u4e00",
		"2" : "\u4e8c",
		"3" : "\u4e09",
		"4" : "\u56db",
		"5" : "\u4e94",
		"6" : "\u516d"
	};
	if (/(y+)/.test(fmt)) {
		fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
	}
	if (/(E+)/.test(fmt)) {
		fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : "") + week[this.getDay() + ""]);
	}
	for ( var k in o) {
		if (new RegExp("(" + k + ")").test(fmt)) {
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
		}
	}
	return fmt;
};

/**
 * 修改number函数乘法bug
 * 
 * @param arg
 * @returns {Number}
 */
Number.prototype.mul = function(arg) {
	var m = 0, s1 = arg.toString(), s2 = this.toString();
	try {
		m += s1.split(".")[1].length;
	} catch (e) {
	}
	try {
		m += s2.split(".")[1].length;
	} catch (e) {
	}
	if(0 != m) {
		return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
	}
	return Number(s1.replace(".", "")) * Number(s2.replace(".", ""));
};

/**
 * 修改number函数加法bug
 * 
 * @param arg
 * @returns {Number}
 */
Number.prototype.add = function(arg) {
	var r1=0, r2=0, m=0;
	try {
		if(arg && arg.toString().split(".").length > 1) {
			r1 = arg.toString().split(".")[1].length;
		}
	} catch (e) {
		r1 = 0;
	}
	try {
		if(this && this.toString().split(".").length > 1) {
			r2 = this.toString().split(".")[1].length;
		}
	} catch (e) {
		r2 = 0;
	}
	if(r1 != 0 || r2 != 0) {
		m = Math.pow(10, Math.max(r1, r2));
		return (arg * m + this * m) / m;
	}
	return arg*1 + this*1;
};

/**
 * 
 * 更换EasyUI主题的方法
 * 
 * @param themeName
 *            主题名称
 * 
 */
dj.changeTheme = function(themeName) {
	var $easyuiTheme = $('#easyuiTheme');
	var url = $easyuiTheme.attr('href');
	var href = url.substring(0, url.indexOf('themes')) + 'themes/' + themeName + '/easyui.css';
	$easyuiTheme.attr('href', href);

	$.ajax({
		type : "POST",
		url : "userExtendAction!changeTheme.action",
		data : "uitheme=" + themeName,
		error : function(info) {
			$.messager.show({
				msg : '主题更新失败！',
				title : '提示'
			});
			eval(info.responseText);
		}
	});
};
/**
 * 播放声音js
 * 
 * @param profile
 *            2个地址
 */
dj.soundComponent = function(profile) {
	this.profile = {
		src : '', // 音频文件地址
		altSrc : '', // 备选音频文件地址 （不同浏览器支持的音频格式不同，可见附表）
		loop : false
	// 是否循环播放，这个参数现在没有用上
	};
	if (profile) {
		$.extend(this.profile, profile);
	}
	this.soundObj = null;
	this.isIE = !-[ 1, ]; /* 这个方法是前辈大牛发明的，利用ie跟非ie中JScript处理数组最后一个逗号“,”的差异, 不过对于IE 9，这个办法就无效了，但此处正合我用，因为IE 9支持audio */
	this.init();
};
dj.soundComponent.prototype = {
	init : function() {
		this._setSrc();
	},
	_setSrc : function() {
		if (this.soundObj) {
			if (this.isIE) {
				this.soundObj[0].src = this.profile.src;
			} else {
				this.soundObj[0].innerHTML = '<source src="' + this.profile.src + '" /><source src="' + this.profile.altSrc + '" />';
			}
		} else {
			if (this.isIE) {
				this.soundObj = $('<bgsound volume="-10000" loop="1" src="' + this.profile.src + '">').appendTo('body'); // -10000是音量的最小值。先把音量关到最小，免得一加载就叮的一声，吓到人。
			} else {
				this.soundObj = $('<audio preload="auto" autobuffer><source src="' + this.profile.src + '" /><source src="' + this.profile.altSrc + '" /></audio>').appendTo('body');
			}
		}
	},
	setSrc : function(src, altSrc) {
		this.profile.src = src;
		if (typeof altSrc != 'undefined') {
			this.profile.altSrc = altSrc;
		}
		this._setSrc();
	},
	play : function() {
		if (this.soundObj) {
			if (this.isIE) {
				this.soundObj[0].volume = 1;// 把音量打开。
				this.soundObj[0].src = this.profile.src;
			} else {
				this.soundObj[0].play();
			}
		}
	}
};

/**
 * MAP对象，实现MAP功能
 * 
 * 接口： size() 获取MAP元素个数 isEmpty() 判断MAP是否为空 clear() 删除MAP所有元素 put(key, value) 向MAP中增加元素（key, value) removeByKey(key) 删除指定KEY的元素，成功返回True，失败返回False removeByValue 删除指定value的元素，成功返回True，失败返回False removeByValueAndKey 删除指定VALUE的元素，成功返回True，失败返回False get(key) 获取指定KEY的元素值VALUE，失败返回NULL element(index) 获取指定索引的元素（使用element.key，element.value获取KEY和VALUE），失败返回NULL containsKey(key) 判断MAP中是否含有指定KEY的元素 containsValue(value) 判断MAP中是否含有指定VALUE的元素 values() 获取MAP中所有VALUE的数组（ARRAY） keys() 获取MAP中所有KEY的数组（ARRAY）
 * 
 * 例子： var map = new Map();
 * 
 * map.put("key", "value"); var val = map.get("key") ……
 * 
 */
var Map = function() {
	this.elements = new Array();

	// 获取MAP元素个数
	this.size = function() {
		return this.elements.length;
	};

	// 判断MAP是否为空
	this.isEmpty = function() {
		return (this.elements.length < 1);
	};

	// 删除MAP所有元素
	this.clear = function() {
		this.elements = new Array();
	};

	// 向MAP中增加元素（key, value)
	this.put = function(_key, _value) {
		this.removeByKey(_key);
		this.elements.push({
			key : _key,
			value : _value
		});
	};

	// 删除指定KEY的元素，成功返回True，失败返回False
	this.removeByKey = function(_key) {
		var bln = false;
		try {
			for (i = 0; i < this.elements.length; i++) {
				if (this.elements[i].key == _key) {
					this.elements.splice(i, 1);
					return true;
				}
			}
		} catch (e) {
			bln = false;
		}
		return bln;
	};

	// 删除指定VALUE的元素，成功返回True，失败返回False
	this.removeByValue = function(_value) {// removeByValueAndKey
		var bln = false;
		try {
			for (i = 0; i < this.elements.length; i++) {
				if (this.elements[i].value == _value) {
					this.elements.splice(i, 1);
					return true;
				}
			}
		} catch (e) {
			bln = false;
		}
		return bln;
	};

	// 删除指定VALUE的元素，成功返回True，失败返回False
	this.removeByValueAndKey = function(_key, _value) {
		var bln = false;
		try {
			for (i = 0; i < this.elements.length; i++) {
				if (this.elements[i].value == _value && this.elements[i].key == _key) {
					this.elements.splice(i, 1);
					return true;
				}
			}
		} catch (e) {
			bln = false;
		}
		return bln;
	};

	// 获取指定KEY的元素值VALUE，失败返回NULL
	this.get = function(_key) {
		try {
			for (i = 0; i < this.elements.length; i++) {
				if (this.elements[i].key == _key) {
					return this.elements[i].value;
				}
			}
		} catch (e) {
			return false;
		}
		return false;
	};

	// 获取指定索引的元素（使用element.key，element.value获取KEY和VALUE），失败返回NULL
	this.element = function(_index) {
		if (_index < 0 || _index >= this.elements.length) {
			return null;
		}
		return this.elements[_index];
	};

	// 判断MAP中是否含有指定KEY的元素
	this.containsKey = function(_key) {
		var bln = false;
		try {
			for (i = 0; i < this.elements.length; i++) {
				if (this.elements[i].key == _key) {
					bln = true;
				}
			}
		} catch (e) {
			bln = false;
		}
		return bln;
	};

	// 判断MAP中是否含有指定VALUE的元素
	this.containsValue = function(_value) {
		var bln = false;
		try {
			for (i = 0; i < this.elements.length; i++) {
				if (this.elements[i].value == _value) {
					bln = true;
				}
			}
		} catch (e) {
			bln = false;
		}
		return bln;
	};

	// 判断MAP中是否含有指定VALUE的元素
	this.containsObj = function(_key, _value) {
		var bln = false;
		try {
			for (i = 0; i < this.elements.length; i++) {
				if (this.elements[i].value == _value && this.elements[i].key == _key) {
					bln = true;
				}
			}
		} catch (e) {
			bln = false;
		}
		return bln;
	};

	// 获取MAP中所有VALUE的数组（ARRAY）
	this.values = function() {
		var arr = new Array();
		for (i = 0; i < this.elements.length; i++) {
			arr.push(this.elements[i].value);
		}
		return arr;
	};

	// 获取MAP中所有VALUE的数组（ARRAY）
	this.valuesByKey = function(_key) {
		var arr = new Array();
		for (i = 0; i < this.elements.length; i++) {
			if (this.elements[i].key == _key) {
				arr.push(this.elements[i].value);
			}
		}
		return arr;
	};

	// 获取MAP中所有KEY的数组（ARRAY）
	this.keys = function() {
		var arr = new Array();
		for (i = 0; i < this.elements.length; i++) {
			arr.push(this.elements[i].key);
		}
		return arr;
	};

	// 获取key通过value
	this.keysByValue = function(_value) {
		var arr = new Array();
		for (i = 0; i < this.elements.length; i++) {
			if (_value == this.elements[i].value) {
				arr.push(this.elements[i].key);
			}
		}
		return arr;
	};

	// 获取MAP中所有KEY的数组（ARRAY）
	this.keysRemoveDuplicate = function() {
		var arr = new Array();
		for (i = 0; i < this.elements.length; i++) {
			var flag = true;
			for ( var j = 0; j < arr.length; j++) {
				if (arr[j] == this.elements[i].key) {
					flag = false;
					break;
				}
			}
			if (flag) {
				arr.push(this.elements[i].key);
			}
		}
		return arr;
	};
};